import Vue from 'vue';
import router from '@/router';
import store from '@/store';

/**
 * 获取uuid
 */
export function getUUID() {
	return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
		return (
			c === 'x' ? (Math.random() * 16) | 0 : 'r&0x3' | '0x8'
		).toString(16);
	});
}

/**
 * 是否有权限
 * @param {*} key
 */
export function isAuth(key) {
	return (
		JSON.parse(sessionStorage.getItem('permissions') || '[]').indexOf(
			key
		) !== -1 || false
	);
}

/**
 * 树形数据转换
 * @param {*} data
 * @param {*} id
 * @param {*} pid
 */
export function treeDataTranslate(data, id = 'id', pid = 'parentId') {
	var res = [];
	var temp = {};
	for (var i = 0; i < data.length; i++) {
		temp[data[i][id]] = data[i];
	}
	for (var k = 0; k < data.length; k++) {
		if (temp[data[k][pid]] && data[k][id] !== data[k][pid]) {
			if (!temp[data[k][pid]].children) {
				temp[data[k][pid]].children = [];
			}
			if (!temp[data[k][pid]]._level) {
				temp[data[k][pid]]._level = 1;
			}
			data[k]._level = temp[data[k][pid]]._level + 1;
			temp[data[k][pid]].children.push(data[k]);
		} else {
			res.push(data[k]);
		}
	}
	return res;
}

/**
 * 清除登录信息
 */
export function clearLoginInfo() {
	localStorage.removeItem('store');
	Vue.cookie.delete('token');
	store.commit('resetStore');
	router.options.isAddDynamicMenuRoutes = false;
}

/**
 * 获取地址栏参数(问号传值)
 * @param name key值
 * @returns {*}
 */
export function getUrlParam(name) {
	return (
		decodeURIComponent(
			(new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(
				location.href
			) || [''])[1].replace(/\+/g, '%20')
		) || null
	);
}

/**
 * 数值转成百分数
 * @param {*} num  数值
 */
export function toPercent(num) {
	return (num + '00').replace(/\.([\d]{2})/, '$1.') * 1;
}

/**
 * 日期格式化
 * @param {*} date 日期
 * @param {*} fmt 格式化样式
 */
export function formatDate(date, fmt) {
	if (/(y+)/.test(fmt)) {
		fmt = fmt.replace(
			RegExp.$1,
			(date.getFullYear() + '').substr(4 - RegExp.$1.length)
		);
	}
	const o = {
		'M+': date.getMonth() + 1,
		'd+': date.getDate(),
		'h+': date.getHours(),
		'm+': date.getMinutes(),
		's+': date.getSeconds(),
	};
	for (const k in o) {
		if (new RegExp(`(${k})`).test(fmt)) {
			const str = o[k] + '';
			fmt = fmt.replace(
				RegExp.$1,
				RegExp.$1.length === 1 ? str : padLeftZero(str)
			);
		}
	}
	return fmt;
}

function padLeftZero(str) {
	return ('00' + str).substr(str.length);
}

/**
 * 数字转逗号分隔
 * @param {*数字} num
 */
export function get_thousand_num(num) {
	return num.toString().replace(/\d+/, function (n) {
		// 先提取整数部分
		return n.replace(/(\d)(?=(\d{3})+$)/g, function ($1) {
			// 对整数部分添加分隔符
			return $1 + ',';
		});
	});
}

/**
 * 数字转整数 如 100000 转为10万
 * @param {需要转化的数} num
 * @param {需要保留的小数位数} point
 */
export function tranNumber(num, point) {
	const numStr = num.toString();
	// 十万以内直接返回
	if (numStr.length < 6) {
		return numStr;
	}
	// 大于8位数是亿
	else if (numStr.length > 8) {
		const decimal = numStr.substring(
			numStr.length - 8,
			numStr.length - 8 + point
		);
		return parseFloat(parseInt(num / 100000000) + '.' + decimal) + '亿';
	}
	// 大于6位数是十万 (以10W分割 10W以下全部显示)
	else if (numStr.length > 5) {
		const decimal = numStr.substring(
			numStr.length - 4,
			numStr.length - 4 + point
		);
		return parseFloat(parseInt(num / 10000) + '.' + decimal) + '万';
	}
}

/**
 * wgs84坐标转百度坐标
 * @param {*} longitude  经度
 * @param {*} latitude  纬度
 * @param {*} callback  回调函数
 */
export function qqMapTransBMap(longitude, latitude, callback) {
	// 微信坐标转换成百度坐标
	var lng = ''; // 经度
	var lat = ''; // 纬度
	var convertor = new window.BMap.Convertor();
	var ggPoint = new window.BMap.Point(longitude, latitude);
	var pointArr = [];
	pointArr.push(ggPoint);
	convertor.translate(pointArr, 1, 5, function (data) {
		if (data.status === 0) {
			lng = data.points[0].lng;
			lat = data.points[0].lat;
			const point = {
				lng: lng,
				lat: lat,
			};
			callback(point);
		}
	});
}

/**
 * WGS84转GCj02
 * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
 * @param lng
 * @param lat
 * @returns {*[]}
 */
export function wgs84togcj02tobd09(lng, lat) {
	const xPI = (3.14159265358979324 * 3000.0) / 180.0;
	const PI = 3.1415926535897932384626;
	const a = 6378245.0;
	const ee = 0.00669342162296594323;
	// WGS84转GCj02
	let dlat = transformlat(lng - 105.0, lat - 35.0);
	let dlng = transformlng(lng - 105.0, lat - 35.0);
	const radlat = (lat / 180.0) * PI;
	let magic = Math.sin(radlat);
	magic = 1 - ee * magic * magic;
	const sqrtmagic = Math.sqrt(magic);
	dlat = (dlat * 180.0) / (((a * (1 - ee)) / (magic * sqrtmagic)) * PI);
	dlng = (dlng * 180.0) / ((a / sqrtmagic) * Math.cos(radlat) * PI);
	const mglat = lat + dlat;
	const mglng = lng + dlng;
	// 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
	const z =
		Math.sqrt(mglng * mglng + mglat * mglat) +
		0.00002 * Math.sin(mglat * xPI);
	const theta = Math.atan2(mglat, mglng) + 0.000003 * Math.cos(mglng * xPI);
	const bdlng = z * Math.cos(theta) + 0.0065;
	const bdlat = z * Math.sin(theta) + 0.006;
	// return [bdlng, bdlat]
	return {
		lng: bdlng,
		lat: bdlat,
	};
}

export function transformlat(lng, lat) {
	const PI = 3.1415926535897932384626;
	var ret =
		-100.0 +
		2.0 * lng +
		3.0 * lat +
		0.2 * lat * lat +
		0.1 * lng * lat +
		0.2 * Math.sqrt(Math.abs(lng));
	ret +=
		((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) *
			2.0) /
		3.0;
	ret +=
		((20.0 * Math.sin(lat * PI) + 40.0 * Math.sin((lat / 3.0) * PI)) *
			2.0) /
		3.0;
	ret +=
		((160.0 * Math.sin((lat / 12.0) * PI) +
			320 * Math.sin((lat * PI) / 30.0)) *
			2.0) /
		3.0;
	return ret;
}

export function transformlng(lng, lat) {
	const PI = 3.1415926535897932384626;
	var ret =
		300.0 +
		lng +
		2.0 * lat +
		0.1 * lng * lng +
		0.1 * lng * lat +
		0.1 * Math.sqrt(Math.abs(lng));
	ret +=
		((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) *
			2.0) /
		3.0;
	ret +=
		((20.0 * Math.sin(lng * PI) + 40.0 * Math.sin((lng / 3.0) * PI)) *
			2.0) /
		3.0;
	ret +=
		((150.0 * Math.sin((lng / 12.0) * PI) +
			300.0 * Math.sin((lng / 30.0) * PI)) *
			2.0) /
		3.0;
	return ret;
}

/**
 * 对Date的扩展，将 Date 转化为指定格式的String
 * 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符， 。
 * 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
 * 例子：
 * (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
 * (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18
 * @param fmt
 * @returns {*}
 * @constructor
 */
Date.prototype.Format = function (fmt) {
	// author: meizz
	var o = {
		'M+': this.getMonth() + 1, // 月份
		'd+': this.getDate(), // 日
		'h+': this.getHours(), // 小时
		'm+': this.getMinutes(), // 分
		's+': this.getSeconds(), // 秒
		'q+': Math.floor((this.getMonth() + 3) / 3), // 季度
		S: this.getMilliseconds(), // 毫秒
	};
	if (/(y+)/.test(fmt))
		fmt = fmt.replace(
			RegExp.$1,
			(this.getFullYear() + '').substr(4 - RegExp.$1.length)
		);
	for (var k in o) {
		if (new RegExp('(' + k + ')').test(fmt)) {
			fmt = fmt.replace(
				RegExp.$1,
				RegExp.$1.length == 1
					? o[k]
					: ('00' + o[k]).substr(('' + o[k]).length)
			);
		}
	}
	return fmt;
};

/**
 * 格式化字符串（用于拼接）
 * 输入"嘉定市","什么区",输出"嘉定市-什么区"
 */
export function formatString(params, ...args) {
	let str = params;
	for (let i = 0; i < args.length; i++) {
		if (args[i]) {
			str += '-' + args[i];
		}
	}
	return str;
}

/*
 * 树结构中除去 children 为空的数组
 */
export function deleteEmptyChildren(tree, children = 'children') {
	for (let i = 0; i < tree.length; i++) {
		if (tree[i][children].length == 0) {
			delete tree[i][children];
		} else {
			deleteEmptyChildren(tree[i][children], children);
		}
	}
	return tree;
}

/**
 * 自适应文字大小
 * @export
 * @param {*} size 文字数值（size/100）
 * @returns
 */
export function setFontSize(size) {
	var windowWidth = document.body.clientWidth;
	if (windowWidth > 1024 && windowWidth < 4000) {
		return (size * windowWidth) / 38.4;
	}
}

/**
 * 屏幕尺寸
 * @export
 * @param {*} size 文字数值（size/169）
 * @returns
 */
export function setLayoutSize(size) {
	let layoutSize = { width: '1920px', height: '1080px' };

	switch (size) {
		case 169:
			layoutSize = {
				width: '1920px',
				height: '1080px',
			};
			break;

		case 329:
			layoutSize = {
				width: '3840px',
				height: '1080px',
			};
			break;
		default:
			break;
	}

	return layoutSize;
}

// 单个文件上传
export const uploadFileServer = `${process.env.VUE_APP_BASE_URL}/video-resource/upload`;

/**
 * Parse the time to string
 * @param {(Object|string|number)} time
 * @param {string} cFormat
 * @returns {string | null}
 */
export function parseTime(time, cFormat) {
	if (arguments.length === 0 || !time) {
		return null;
	}
	const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}';
	let date;
	if (typeof time === 'object') {
		date = time;
	} else {
		if (typeof time === 'string') {
			if (/^[0-9]+$/.test(time)) {
				time = parseInt(time);
			} else {
				if (time.length < 20) {
					time = time.replace(new RegExp(/-/gm), '/');
				}
			}
		}
		if (typeof time === 'number' && time.toString().length === 10) {
			time = time * 1000;
		}
		date = new Date(time);
	}
	const formatObj = {
		y: date.getFullYear(),
		m: date.getMonth() + 1,
		d: date.getDate(),
		h: date.getHours(),
		i: date.getMinutes(),
		s: date.getSeconds(),
		a: date.getDay(),
	};
	const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
		const value = formatObj[key];
		// Note: getDay() returns 0 on Sunday
		if (key === 'a') {
			return ['日', '一', '二', '三', '四', '五', '六'][value];
		}
		return value.toString().padStart(2, '0');
	});
	return time_str;
}

/**
 * @param {number} time
 * @param {string} option
 * @returns {string}
 */
export function formatTime(time, option) {
	if (('' + time).length === 10) {
		time = parseInt(time) * 1000;
	} else {
		time = +time;
	}
	const d = new Date(time);
	const now = Date.now();

	const diff = (now - d) / 1000;

	if (diff < 30) {
		return '刚刚';
	} else if (diff < 3600) {
		// less 1 hour
		return Math.ceil(diff / 60) + '分钟前';
	} else if (diff < 3600 * 24) {
		return Math.ceil(diff / 3600) + '小时前';
	} else if (diff < 3600 * 24 * 2) {
		return '1天前';
	}
	if (option) {
		return parseTime(time, option);
	} else {
		return (
			d.getMonth() +
			1 +
			'月' +
			d.getDate() +
			'日' +
			d.getHours() +
			'时' +
			d.getMinutes() +
			'分'
		);
	}
}

/**
 * @param {string} url
 * @returns {Object}
 */
export function param2Obj(url) {
	const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ');
	if (!search) {
		return {};
	}
	const obj = {};
	const searchArr = search.split('&');
	searchArr.forEach((v) => {
		const index = v.indexOf('=');
		if (index !== -1) {
			const name = v.substring(0, index);
			const val = v.substring(index + 1, v.length);
			obj[name] = val;
		}
	});
	return obj;
}

/**
 * 生成随机串
 * @param {number} length 随机串的长度 默认32位
 * @returns {String}
 */
export function randomString(length = 32) {
	const chars =
		'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
	var result = '';
	for (var i = length; i > 0; --i)
		result += chars[Math.floor(Math.random() * chars.length)];
	return result;
}
